using Godot;

public partial class AnchorBullet : Area2D
{
    [Export] public float Speed = 800.0f; // 子弹速度
    [Export] private VisibleOnScreenNotifier2D notifier; // 用于检测子弹是否飞出屏幕

    // 1. 引用拖尾
    [Export] public Line2D TrailNode;
    private Vector2 _direction;
    private PlayerColor _color;
    private BridgeGun _gunRef; // 引用发射它的枪，用于回调
    private bool _hasHit = false;



    const int WorldLayer = Cfg.WorldLayer;
    const int RedLayer = Cfg.RedLayer;
    const int BlueLayer = Cfg.BlueLayer;
    const int GreenLayer = Cfg.GreenLayer;
    // const int PlayerLayer = Cfg.PlayerLayer;
    const int ProjectileLayer = Cfg.ProjectileLayer;
    public void Setup(Vector2 pos, Vector2 dir, PlayerColor color, BridgeGun gun)
    {
        GlobalPosition = pos;
        _direction = dir.Normalized();
        _color = color;
        _gunRef = gun;

        // 设置颜色
        Modulate = Cfg.GetColorValue(color);

        // 旋转子弹让它朝向飞行方向 (如果是长条形子弹很有用)
        Rotation = _direction.Angle();


        // 设置碰撞层和掩码
        CollisionLayer = WorldLayer | ProjectileLayer;
        CollisionMask = WorldLayer | ProjectileLayer;


        if (_color == PlayerColor.Red)
        {
            //会与red layer 的物体碰撞
            CollisionLayer |= RedLayer; // Red layer
            CollisionMask |= RedLayer; // Red layer
        }
        else if (_color == PlayerColor.Blue)
        {
            //会与blue layer 的物体碰撞
            CollisionLayer |= BlueLayer; // Blue layer
            CollisionMask |= BlueLayer; // Blue layer
        }
        else if (_color == PlayerColor.Green)
        {
            //会与green layer 的物体碰撞
            CollisionLayer |= GreenLayer; // Green layer
            CollisionMask |= GreenLayer; // Green layer
        }

        if (TrailNode != null && TrailNode.Gradient != null)
        {
            Color targetColor = Cfg.GetColorValue(color);

            // 获取渐变资源
            Gradient grad = TrailNode.Gradient;

            // 修改起点 (索引0) 的颜色
            grad.SetColor(0, targetColor);

            // 修改终点 (索引1) 的颜色 Alpha设为0
            Color endColor = targetColor;
            endColor.A = 0;
            grad.SetColor(1, endColor);
        }

    }


    public override void _Ready()
    {

        BodyEntered += OnBodyEntered;
        // 连接屏幕退出信号
        // 监听子弹是否飞出屏幕
        notifier.ScreenExited += OnScreenExited;

    }

    public override void _PhysicsProcess(double delta)
    {
        // 简单的直线飞行
        GlobalPosition += _direction * Speed * (float)delta;
    }

    // 信号连接：OnBodyEntered
    public void OnBodyEntered(Node2D body)
    {
        GD.Print("子弹撞到了: " + body.Name); // 调试信息！看看控制台有没有输出

        if (_hasHit) return;
        _hasHit = true;

        // 可以在这里再次判断 layer，虽然 Mask 已经过滤过了
        // 这里的 1 对应 Layer 1 (World)
        // if (body.GetCollisionLayerValue(1)) 

        _gunRef.OnBulletHit(GlobalPosition, _color);
        BulletDestroy();
    }

    public void OnScreenExited()
    {
        GD.Print("子弹飞出屏幕，销毁");
        // QueueFree(); // 飞出屏幕就销毁
        BulletDestroy();
    }


    public void BulletDestroy()
    {
        // 1. 停止移动和碰撞 (让它停在原地)
        SetPhysicsProcess(false);
        GetNode<CollisionShape2D>("CollisionShape2D").CallDeferred("set_disabled", true);

        // 2. 隐藏子弹本体 (Sprite), 但保留拖尾显示
        GetNode<Sprite2D>("Sprite2D").Visible = false;

        // 3. 等待拖尾消失 

        // 创建一个 Tween 来快速收缩拖尾，然后销毁整个对象
        // 这会让拖尾快速追上子弹击中点，产生一种“能量注入”的感觉
        var tween = CreateTween();

        // 让拖尾在 0.2秒内 宽度变0 或者 透明度变0
        if (TrailNode != null)
        {
            tween.TweenProperty(TrailNode, "width", 0, 0.2f);
        }

        // 动画结束后，彻底销毁子弹对象
        tween.TweenCallback(Callable.From(QueueFree));

    }

    // public void BulletDestroyWithoutBridge()
    // {
    //     // 直接销毁子弹
    //     QueueFree();
    // }
}